查看原文
其他

股评师分析报告文本情感分析预测股价

大邓 大邓和他的Python 2022-07-09


github有一个Apple股价预测项目,https://github.com/Twabeeric/AAPLTextMining 

股评师分析报告是否会对股价产生影响,为此本文使用文本情感分析对股评师报告对文本数据进行了度量。

项目数据包括:

  • Apple 2017-2018股价数据

  • ThomsonOne网站Sherri Scribner(德意志银行股评师)对Apple公司周度研究报告(2017-2018),有65个docx文件

导入数据

我们需要按照日期,将报告与股价数据按照日期合并到一起, 我们先导入分析师报告,一共有65个docx文件

  1. from io import StringIO

  2. import pandas as pd

  3. import datetime

  4. import re

  5. import docx

  6. import os




  7. def read_from_docx(file_path):

  8. """

  9. 读取docx文件,并返回其中的文本内容

  10. :param file_path: docx文件路径

  11. :return: docx中的文本内容

  12. """

  13. texts = ''

  14. doc = docx.Document(file_path)

  15. for para in doc.paragraphs:

  16. texts += para.text

  17. return texts







  18. flist = [f for f in os.listdir('data/reports') if 'docx' in f]

  19. Descriptions = [read_from_docx('data/reports/'+f) for f in flist]

  20. Dates = [f[:8] for f in flist]



  21. data1 = pd.DataFrame({'Date': Dates,

  22. 'Descriptions': Descriptions})



  23. data1.head()

将日期Date整理为datetime类型

  1. data1['Date'] = pd.to_datetime(data1['Date'])

  2. data1.sort_values('Date', inplace=True)

  3. data1.head()

导入Apple公司股价数据

  1. data2= pd.read_csv('data/AAPL.csv')

  2. data2['Date'] = pd.to_datetime(data2['Date'])

  3. data2.head()

将股价和分析师报告按照Date合并

  1. df = pd.merge(data1, data2)

  2. df.head()

文本情感计算

pysentiment库对金融文本数据进行情感计算。查了下该库的官方文档,发现该库提供了两大情感分析

  • Harvard IV-4 英文通用情感分析,喜怒哀乐,主要是形容词情感词典

  • Loughran&MCdonald 英文金融情感分析,金融领域特有的情感词典

该库的教程可见于 http://bit.ly/2LECfw5

使用pandas的apply批处理方法,可以批量对对某一列施行某种算法(计算函数)

  1. from pysentiment import lm,hiv4



  2. lm = lm.LM()

  3. hiv4 = hiv4.HIV4()



  4. def hiv4_positive(text):

  5. words = hiv4.tokenize(text)

  6. score = hiv4.get_score(words)

  7. return score['Positive']



  8. def hiv4_negative(text):

  9. words = hiv4.tokenize(text)

  10. score = hiv4.get_score(words)

  11. return score['Negative']



  12. def hiv4_polarity(text):

  13. words = hiv4.tokenize(text)

  14. score = hiv4.get_score(words)

  15. return score['Polarity']



  16. def hiv4_subjectivity(text):

  17. words = hiv4.tokenize(text)

  18. score = hiv4.get_score(words)

  19. return score['Subjectivity']



  20. def lm_positive(text):

  21. words = lm.tokenize(text)

  22. score = lm.get_score(words)

  23. return score['Positive']



  24. def lm_negative(text):

  25. words = lm.tokenize(text)

  26. score = lm.get_score(words)

  27. return score['Negative']



  28. def lm_polarity(text):

  29. words = lm.tokenize(text)

  30. score = lm.get_score(words)

  31. return score['Polarity']



  32. def lm_subjectivity(text):

  33. words = lm.tokenize(text)

  34. score = lm.get_score(words)

  35. return score['Subjectivity']




  36. df['hiv4_pos'] = df['Descriptions'].apply(hiv4_positive)

  37. df['hiv4_neg'] = df['Descriptions'].apply(hiv4_negative)

  38. df['hiv4_polarity'] = df['Descriptions'].apply(hiv4_polarity)

  39. df['hiv4_subjectivity'] = df['Descriptions'].apply(hiv4_subjectivity)



  40. df['lm_pos'] = df['Descriptions'].apply(lm_positive)

  41. df['lm_neg'] = df['Descriptions'].apply(lm_negative)

  42. df['lm_polarity'] = df['Descriptions'].apply(lm_polarity)

  43. df['lm_subjectivity'] = df['Descriptions'].apply(lm_subjectivity)



  44. df.head()

可视化

查看股价与报告的情感得分走势关系

  1. import matplotlib.pyplot as plt

  2. import seaborn as sns


  3. f, axes = plt.subplots(nrows=2, ncols=1, figsize=(14, 6))

  4. axes[0].set_title('Stock Price、HIV4_polarity & LM_polarity')

  5. sns.lineplot(x="Date", y="Adj Close", data = df, label='Price', ax=axes[0]);

  6. sns.lineplot(x="Date", y="hiv4_polarity", data = df, label='hiv4_polarity', ax=axes[1]);

  7. sns.lineplot(x="Date", y="lm_polarity", data = df, label='lm_polarity', ax=axes[1]);

本文只是找了很少的数据,从图中走势看,LM金融情感极性得分(lm_polarity)与股价price走势更相似。说明对于苹果公司而言,通过对股评师有关苹果公司的报告进行文本情感计算,能够一定程度上预测股价走势。

近期文章

精选课程 | Python数据分析实战(学术)

代码不到40行的超燃动态排序图

使用Python自动生成事件分析图谱

Loughran&McDonald金融文本情感分析库

使用分析师报告中含有的情感信息预测上市公司股价变动

日期数据操作第1期 datetime库

日期数据操作第2期 pandas库

史上最大规模1.4亿中文知识图谱开源下载

【公开视频课】Python语法快速入门

【公开视频课】ython爬虫快速入门

文本数据分析文章汇总(2016-至今)

当文本分析遇到乱码(ง'⌣')ง怎么办?

当pandas遇上数据类型问题

如何理解pandas中的transform函数

一行pandas代码生成哑变量

Python最被低估的库,用好了效率提升10倍!


课件获取方式,请在公众号后台回复关键词“20191211


觉得本文有用,请不吝点赞评论转发~谢谢支持~


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存